Asssumes you have aready run: - config - workflow_deepseaNiN_Start

You now have the objects needed to explore the dataset and find the best way to apply biogeographic splits. This is a pre-step before running the workflow again on the split dataset to explore possible LKMs.

Finding Regional (biogeographic) Splits

This requires exploring the dataset to theorise the best ways to split the data with: - environmental biplots/colourings

then applying the splits.

Libraries

library(plotly)
library(readxl)

Exploring biplots

make full dataset to explore

should include all env Vars and otus to explore, and make species richness variable

#add species data and sp richness variable
env_sub_meta1<-cbind(env,otu_6)
env_sub_meta1$spRich<-rowSums(otu_6[,-c(1:which(colnames(otu_6)=="Zoanthidae"))]!=0)

#rename X
env_sub_meta1$X <- env$X.y
env_sub_meta1 <-env_sub_meta1 %>% select (-c(X.y))

#add samplID
env_sub_meta1$SampID<-envSel$SampID

Add provisional biotope data to env file

Note that biotopes were last assigned in march 2022 and therefore there are some addional samples that have not yet got a biotope assigned. These should just be NAs

biotopeInfo<-read_xlsx(file.path(dataPath, "inputs/MAREANO_provisional_biotope_classification_0322.xlsx"), sheet=1) %>%
  select(-c(x_coordinate_UTM33N, y_coordinate_UTM33N))

env_sub_meta<-left_join(env_sub_meta1,biotopeInfo)

a colour palette for discrete plots (see later in script)

cbPalette <- c("#999999", "#E69F00", "#56B4E9", "#009E73", "#F0E442", "#0072B2", "#D55E00", "#CC79A7")

Find min max of vars for scales

summary(env_sub_meta)
 Tmean_Robinson      salt_max     Smax_Robinson   swDensRob_avs  BO22_icecoverltmax_ss BO22_icecovermean_ss
 Min.   :-1.067   Min.   :34.81   Min.   :34.43   Min.   :1027   Min.   :0.00000       Min.   :0.000000    
 1st Qu.: 4.334   1st Qu.:34.98   1st Qu.:35.01   1st Qu.:1028   1st Qu.:0.00000       1st Qu.:0.000000    
 Median : 6.483   Median :35.13   Median :35.13   Median :1029   Median :0.00000       Median :0.000000    
 Mean   : 5.732   Mean   :35.11   Mean   :35.12   Mean   :1029   Mean   :0.02378       Mean   :0.007361    
 3rd Qu.: 7.285   3rd Qu.:35.19   3rd Qu.:35.30   3rd Qu.:1029   3rd Qu.:0.00000       3rd Qu.:0.000000    
 Max.   : 8.447   Max.   :35.82   Max.   :35.42   Max.   :1032   Max.   :0.92838       Max.   :0.409033    
 BO22_dissoxmean_bdmean BO22_ppltmin_ss          X.y                Y              spd_std        CSpdsd_Robinson    
 Min.   :282.5          Min.   :0.000e+00   Min.   :-107939   Min.   :6944134   Min.   :0.02103   Min.   :8.460e-06  
 1st Qu.:286.3          1st Qu.:0.000e+00   1st Qu.: 167561   1st Qu.:7315434   1st Qu.:0.05734   1st Qu.:3.822e-03  
 Median :293.8          Median :7.007e-06   Median : 495261   Median :7794534   Median :0.06821   Median :7.376e-03  
 Mean   :299.3          Mean   :1.152e-04   Mean   : 499401   Mean   :7710165   Mean   :0.07648   Mean   :9.172e-03  
 3rd Qu.:306.4          3rd Qu.:6.220e-05   3rd Qu.: 746161   3rd Qu.:8036434   3rd Qu.:0.09040   3rd Qu.:1.296e-02  
 Max.   :372.2          Max.   :1.067e-03   Max.   :1162261   Max.   :8949734   Max.   :0.18145   Max.   :5.305e-02  
      mud            gravel      BO22_silicateltmax_bdmean     bathy             gnmds1            gnmds2       
 Min.   : 0.00   Min.   : 0.00   Min.   :4.585             Min.   :-858.93   Min.   :-1.9714   Min.   :-3.4880  
 1st Qu.: 7.00   1st Qu.: 1.50   1st Qu.:5.905             1st Qu.:-362.36   1st Qu.:-0.3490   1st Qu.:-0.3604  
 Median :24.00   Median :18.00   Median :6.271             Median :-272.37   Median :-0.1435   Median :-0.1441  
 Mean   :26.83   Mean   :21.53   Mean   :6.368             Mean   :-306.32   Mean   : 0.0000   Mean   : 0.0000  
 3rd Qu.:35.00   3rd Qu.:35.00   3rd Qu.:6.581             3rd Qu.:-200.08   3rd Qu.: 0.3031   3rd Qu.: 0.3296  
 Max.   :96.00   Max.   :65.00   Max.   :9.565             Max.   : -38.47   Max.   : 5.2198   Max.   : 2.2982  
       X          
 Min.   :-107939  
 1st Qu.: 167561  
 Median : 495261  
 Mean   : 499401  
 3rd Qu.: 746161  
 Max.   :1162261  

Plots with CONTINUOUS colour scales (variables)

Bathy v Temp w gnmds ax 1
tb_ax1<- ggplot(data = env_sub_meta,
                      aes(x = Tmean_Robinson,
                          y = bathy)) +
  theme_classic() +
  geom_point(aes(colour = gnmds1),
             size = 1) +
  scale_colour_gradientn(limits = c(-2, 2.5),
                        colors=c('red','yellow','green'))+
  ggtitle("Temp (mean Robinson) vs Bathy - coloured by gnmds r6 ax1 - grey 2.5-5")

tb_ax1

Save the plot
ggsave(filename = file.path(dataPath,"outputs/LoDensbathy_v_temp_nmds1.png"),
       device = "png",
       dpi=300 )
Saving 7 x 7 in image
Bathy v Temp w salinity
tb_ax1<- ggplot(data = env_sub_meta,
                      aes(x = Tmean_Robinson,
                          y = bathy)) +
  theme_classic() +
  geom_point(aes(colour = Smax_Robinson),
             size = 1) +
  scale_colour_gradientn(limits = c(34.43, 35.43),
                        colors=c('green','yellow','blue'))+
  ggtitle("Temp (mean Robinson) vs Bathy - coloured by salinity")

tb_ax1

Save the plot
ggsave(filename = file.path(dataPath,"outputs/LoDensbathy_v_temp_salinityMax.png"),
       device = "png",
       dpi=300 )
Saving 7 x 7 in image
Bathy v Temp w longitude
tb_ax1<- ggplot(data = env_sub_meta,
                      aes(x = Tmean_Robinson,
                          y = bathy)) +
  theme_classic() +
  geom_point(aes(colour = X.y),
             size = 1) +
  scale_colour_gradientn(limits = c(-107939, 1162261),
                        colors=c('red','yellow','blue'))+
  ggtitle("Temp (mean Robinson) vs Bathy - coloured by longitude")

tb_ax1

Save the plot
ggsave(filename = file.path(dataPath,"outputs/LoDensbathy_v_temp_longitude.png"),
       device = "png",
       dpi=300 )
Saving 7 x 7 in image
Bathy v Temp w latitude
tb_ax1<- ggplot(data = env_sub_meta,
                      aes(x = Tmean_Robinson,
                          y = bathy)) +
  theme_classic() +
  geom_point(aes(colour = Y),
             size = 1) +
  scale_colour_gradientn(limits = c(6944134, 8949734),
                        colors=c('red','yellow','blue'))+
  ggtitle("Temp (mean Robinson) vs Bathy - coloured by latitude")

tb_ax1

Save the plot
ggsave(filename = file.path(dataPath,"outputs/LoDensbathy_v_temp_latitude.png"),
       device = "png",
       dpi=300 )
Saving 7 x 7 in image
Bathy v Temp w iceCovLTMax
tb_ax1<- ggplot(data = env_sub_meta,
                      aes(x = Tmean_Robinson,
                          y = bathy)) +
  theme_classic() +
  geom_point(aes(colour = BO22_icecoverltmax_ss),
             size = 1) +
  scale_colour_gradientn(limits = c(0,0.93),
                        colors=c('grey','turquoise','blue'))+
  ggtitle("Temp (mean Robinson) vs Bathy - coloured by ice cover LT max")

tb_ax1

Save the plot
ggsave(filename = file.path(dataPath,"outputs/LoDensbathy_v_temp_iceCovLTmax.png"),
       device = "png",
       dpi=300 )
Saving 7 x 7 in image
Bathy v Salinity coloured by temp
tb_ax1<- ggplot(data = env_sub_meta,
                      aes(x = Smax_Robinson,
                          y = bathy)) +
  theme_classic() +
  geom_point(aes(colour = Tmean_Robinson),
             size = 1) +
  scale_colour_gradientn(limits = c(-1.1, 8.5),
                        colors=c('red','yellow','green'))+
  ggtitle("Salinity (max Robinson) vs Bathy - coloured by av Temp (R)")

tb_ax1

Save the plot
ggsave(filename = file.path(dataPath,"outputs/LoDensbathy_v_salMax_temp.png"),
       device = "png",
       dpi=300 )
Saving 7 x 7 in image
Salinity v Temp gnmds1
tb_ax1<- ggplot(data = env_sub_meta,
                      aes(x = Smax_Robinson,
                          y = Tmean_Robinson)) +
  theme_classic() +
  geom_point(aes(colour = gnmds1),
             size = 1) +
scale_colour_gradientn(limits = c(-2, 2.5),
                        colors=c('red','yellow','green'))+
  ggtitle("Temp (mean Robinson) vs Salinity (max R) - coloured by gnmds r6 ax 1 - grey 2.5-5")

tb_ax1

Save the plot
ggsave(filename = file.path(dataPath,"outputs/LoDenstempRmean_v_salinityRmax_nmds1.png"),
       device = "png",
       dpi=300 )
Saving 7 x 7 in image
Salinity v Temp dissoxmean
tb_ax1<- ggplot(data = env_sub_meta,
                      aes(x = Smax_Robinson,
                          y = Tmean_Robinson)) +
  theme_classic() +
  geom_point(aes(colour = BO22_dissoxmean_bdmean),
             size = 1) +
scale_colour_gradientn(limits = c(282.5, 372.2),
                        colors=c('red','yellow','green'))+
  ggtitle("Temp (mean Robinson) vs Salinity (max R) - coloured by dissolved oxygen")

tb_ax1

Save the plot
ggsave(filename = file.path(dataPath,"outputs/LoDenstempRmean_v_salinityRmax_disooxmean.png"),
       device = "png",
       dpi=300 )
Saving 7 x 7 in image
TS - icecoverLTMax
tb_ax1<- ggplot(data = env_sub_meta,
                      aes(x = Smax_Robinson,
                          y = Tmean_Robinson)) +
  theme_classic() +
  geom_point(aes(colour = BO22_icecoverltmax_ss),
             size = 1) +
  scale_colour_gradientn(limits = c(0,0.93),
                        colors=c('blue','green','red'))+
  ggtitle("Temp (AvR) v Salinity (maxR) - coloured by ice cover LT max")

tb_ax1

Save the plot
ggsave(filename = file.path(dataPath,"outputs/LoDens_TempAvSalMax_iceCoveLTmax.png"),
       device = "png",
       dpi=800 )
Saving 7 x 7 in image
X v Y - temp
tb_ax1<- ggplot(data = env_sub_meta,
                      aes(x = X,
                          y = Y)) +
  theme_classic() +
  geom_point(aes(colour = Tmean_Robinson),
             size = 1) +
  scale_colour_gradientn(limits = c(-1.1, 8.5),
                        colors=c('blue','green','red'))+
  ggtitle("Geography (X v Y) - coloured by mean temp")

ggplotly(tb_ax1)

NA
Save the plot
ggsave(filename = file.path(dataPath,"outputs/LoDens_X_v_Y_tmeanR.png"),
       device = "png",
       dpi=300 )
Saving 7 x 7 in image
X v Y - density
tb_ax1<- ggplot(data = env_sub_meta,
                      aes(x = X.y,
                          y = Y)) +
  theme_classic() +
  geom_point(aes(colour = swDensRob_avs),
             size = 1) +
  scale_colour_gradientn(limits = c(1027, 1032),
                        colors=c('blue','green','red'))+
  ggtitle("Geography (X v Y) - coloured by water density")

tb_ax1

Save the plot
ggsave(filename = file.path(dataPath,"outputs/LoDens_X_v_Y_swDenRobavs.png"),
       device = "png",
       dpi=800 )
Saving 7 x 7 in image
X v Y - dissox
tb_ax1<- ggplot(data = env_sub_meta,
                      aes(x = X.y,
                          y = Y)) +
  theme_classic() +
  geom_point(aes(colour = BO22_dissoxmean_bdmean),
             size = 1) +
  scale_colour_gradientn(limits = c(282,373),
                        colors=c('blue','green','red'))+
  ggtitle("Geography (X v Y) - coloured by dissovled oxygen")

tb_ax1

Save the plot
ggsave(filename = file.path(dataPath,"outputs/LoDens_X_v_Y_dissox.png"),
       device = "png",
       dpi=800 )
Saving 7 x 7 in image
X v Y - icecoverLTMax
tb_ax1<- ggplot(data = env_sub_meta,
                      aes(x = X.y,
                          y = Y)) +
  theme_classic() +
  geom_point(aes(colour = BO22_icecoverltmax_ss),
             size = 1) +
  scale_colour_gradientn(limits = c(0,0.93),
                        colors=c('blue','green','red'))+
  ggtitle("Geography (X v Y) - coloured by ice cover LT max")

tb_ax1

Save the plot
ggsave(filename = file.path(dataPath,"outputs/LoDens_X_v_Y_iceCoveLTmax.png"),
       device = "png",
       dpi=800 )
Saving 7 x 7 in image
Temp v disoxltmin gnmds
tb_ax1<- ggplot(data = env_sub_meta,
                      aes(x = Tmean_Robinson,
                          y = BO22_dissoxmean_bdmean)) +
  theme_classic() +
  geom_point(aes(colour = gnmds1),
             size = 1) +
  scale_colour_gradientn(limits = c(-2, 2.5),
                        colors=c('red','yellow','green'))+
  ggtitle("Temp (mean Robinson) v disox mean - coloured by gnmds ax 1 - grey 2.5-5")

tb_ax1

Save the plot
ggsave(filename = file.path(dataPath,"outputs/LoDens_TmeanR_v_dissoxltmin_gnmds1.png"),
       device = "png",
       dpi=300 )
Saving 7 x 7 in image
Temp v disoxltmin bathy
tb_ax1<- ggplot(data = env_sub_meta,
                      aes(x = Tmean_Robinson,
                          y = BO22_dissoxmean_bdmean)) +
  theme_classic() +
  geom_point(aes(colour = bathy),
             size = 1) +
  scale_colour_gradientn(limits = c(-860, -30),
                        colors=c('red','yellow','green'))+
  ggtitle("Temp (mean Robinson) v disox mean - coloured by bathymetry")

tb_ax1

Save the plot
ggsave(filename = file.path(dataPath,"outputs/LoDensTmeanR_v_dissoxltmin_bathy.png"),
       device = "png",
       dpi=300 )
Saving 7 x 7 in image

Plots with DISCRETE colour scales (variables)

X v Y with mld-bathy categories

dis_split <- ggplot(data = env,
              aes(x = X.y,
                  y = Y)) +
  theme_classic() +
  geom_point(aes(colour = MLDmean_bathy),
             size = 1) +
  scale_colour_manual(values=cbPalette)+
 # scale_colour_brewer(palette = "Set3") +
  ggtitle("Easting vs Northing - coloured by Mixed layer depth proximity")

dis_split

Save the plot
ggsave(filename = file.path(dataPath,"outputs/LoDens_XvY_MLDmeanBathy.png"),
       device = "png",
       dpi=300 )
Saving 7 x 7 in image

categorise gnmds

env_sub_meta$ax1cat<-cut(env_sub_meta$gnmds1, 
      breaks=c(-3.2,-3,-2,-1,0,1,2,3,3.46))

env_sub_meta$ax2cat<-cut(env_sub_meta$gnmds2, 
      breaks=c(-1.9,-1,0,1,2,3,4,4.9))

X v Y with gnmds ax 1 as HC categories

dis_split <- ggplot(data = env_sub_meta,
              aes(x = X.y,
                  y = Y)) +
  theme_classic() +
  geom_point(aes(colour = ax1cat),
             size = 1) +
 # scale_colour_manual(values=cbPalette) +# non-ordered colourblind pallette
  scale_colour_brewer(palette = "Spectral") + # ordered colourblind pallette
  ggtitle("Easting vs Northing - coloured by gnmds axis 1 HC units")

dis_split

Save the plot
ggsave(filename = file.path(dataPath,"outputs/LoDens_XvY_ax1cat.png"),
       device = "png",
       dpi=300 )
Saving 7 x 7 in image

X v Y with gnmds ax 2 as HC categories

dis_split <- ggplot(data = env_sub_meta,
              aes(x = X.y,
                  y = Y)) +
  theme_classic() +
  geom_point(aes(colour = ax2cat),
             size = 1) +
 # scale_colour_manual(values=cbPalette) +# non-ordered colourblind pallette
  scale_colour_brewer(palette = "Spectral") + # ordered colourblind pallette
  ggtitle("Easting vs Northing - coloured by gnmds axis 2 HC units")

dis_split

Save the plot
ggsave(filename = file.path(dataPath,"outputs/LoDens_XvY_ax2cat.png"),
       device = "png",
       dpi=300 )
Saving 7 x 7 in image

Save environment

EDIT AREA FIRST!

save.image("I:/Scripts/deepseaNiN/Renv_deepseaNiN_LoDens.RData") # edit area first

NOW CLEAR ENVIRONMENT BEFORE RUNNING FOR NEW AREA

LS0tDQp0aXRsZTogIk1BUkVBTk8gLSBOaU46c3BsaXR0aW5nIGJpb2dlb2dyYXBoaWMgcmVnaW9uc19Mb0RlbnMiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpBc3NzdW1lcyB5b3UgaGF2ZSBhcmVhZHkgcnVuOg0KLSBjb25maWcNCi0gd29ya2Zsb3dfZGVlcHNlYU5pTl9TdGFydA0KDQpZb3Ugbm93IGhhdmUgdGhlIG9iamVjdHMgbmVlZGVkIHRvIGV4cGxvcmUgdGhlIGRhdGFzZXQgYW5kIGZpbmQgdGhlIGJlc3Qgd2F5IHRvIGFwcGx5IGJpb2dlb2dyYXBoaWMgc3BsaXRzLiBUaGlzIGlzIGEgcHJlLXN0ZXAgYmVmb3JlIHJ1bm5pbmcgdGhlIHdvcmtmbG93IGFnYWluIG9uIHRoZSBzcGxpdCBkYXRhc2V0IHRvIGV4cGxvcmUgcG9zc2libGUgTEtNcy4NCg0KIyBGaW5kaW5nIFJlZ2lvbmFsIChiaW9nZW9ncmFwaGljKSBTcGxpdHMNCg0KVGhpcyByZXF1aXJlcyBleHBsb3JpbmcgdGhlIGRhdGFzZXQgdG8gdGhlb3Jpc2UgdGhlIGJlc3Qgd2F5cyB0byBzcGxpdCB0aGUgZGF0YSB3aXRoOg0KLSBlbnZpcm9ubWVudGFsIGJpcGxvdHMvY29sb3VyaW5ncw0KDQoNCnRoZW4gYXBwbHlpbmcgdGhlIHNwbGl0cy4gDQoNCg0KIyMjIExpYnJhcmllcw0KYGBge3J9DQpsaWJyYXJ5KHBsb3RseSkNCmxpYnJhcnkocmVhZHhsKQ0KYGBgDQoNCg0KDQoNCiMjIEV4cGxvcmluZyBiaXBsb3RzDQojIyMjIG1ha2UgZnVsbCBkYXRhc2V0IHRvIGV4cGxvcmUgDQpzaG91bGQgaW5jbHVkZSBhbGwgZW52IFZhcnMgYW5kIG90dXMgdG8gZXhwbG9yZSwgYW5kIG1ha2Ugc3BlY2llcyByaWNobmVzcyB2YXJpYWJsZQ0KDQpgYGB7cn0NCiNhZGQgc3BlY2llcyBkYXRhIGFuZCBzcCByaWNobmVzcyB2YXJpYWJsZQ0KZW52X3N1Yl9tZXRhMTwtY2JpbmQoZW52LG90dV82KQ0KZW52X3N1Yl9tZXRhMSRzcFJpY2g8LXJvd1N1bXMob3R1XzZbLC1jKDE6d2hpY2goY29sbmFtZXMob3R1XzYpPT0iWm9hbnRoaWRhZSIpKV0hPTApDQoNCiNyZW5hbWUgWA0KZW52X3N1Yl9tZXRhMSRYIDwtIGVudiRYLnkNCmVudl9zdWJfbWV0YTEgPC1lbnZfc3ViX21ldGExICU+JSBzZWxlY3QgKC1jKFgueSkpDQoNCiNhZGQgc2FtcGxJRA0KZW52X3N1Yl9tZXRhMSRTYW1wSUQ8LWVudlNlbCRTYW1wSUQNCg0KYGBgDQoNCg0KIyMjIEFkZCBwcm92aXNpb25hbCBiaW90b3BlIGRhdGEgdG8gZW52IGZpbGUNCk5vdGUgdGhhdCBiaW90b3BlcyB3ZXJlIGxhc3QgYXNzaWduZWQgaW4gbWFyY2ggMjAyMiBhbmQgdGhlcmVmb3JlIHRoZXJlIGFyZSBzb21lIGFkZGlvbmFsIHNhbXBsZXMgdGhhdCBoYXZlIG5vdCB5ZXQgZ290IGEgYmlvdG9wZSBhc3NpZ25lZC4gVGhlc2Ugc2hvdWxkIGp1c3QgYmUgTkFzDQpgYGB7cn0NCmJpb3RvcGVJbmZvPC1yZWFkX3hsc3goZmlsZS5wYXRoKGRhdGFQYXRoLCAiaW5wdXRzL01BUkVBTk9fcHJvdmlzaW9uYWxfYmlvdG9wZV9jbGFzc2lmaWNhdGlvbl8wMzIyLnhsc3giKSwgc2hlZXQ9MSkgJT4lDQogIHNlbGVjdCgtYyh4X2Nvb3JkaW5hdGVfVVRNMzNOLCB5X2Nvb3JkaW5hdGVfVVRNMzNOKSkNCg0KZW52X3N1Yl9tZXRhPC1sZWZ0X2pvaW4oZW52X3N1Yl9tZXRhMSxiaW90b3BlSW5mbykNCmBgYA0KDQoNCiMjIyBhIGNvbG91ciBwYWxldHRlIGZvciBkaXNjcmV0ZSBwbG90cyAoc2VlIGxhdGVyIGluIHNjcmlwdCkNCg0KYGBge3J9DQpjYlBhbGV0dGUgPC0gYygiIzk5OTk5OSIsICIjRTY5RjAwIiwgIiM1NkI0RTkiLCAiIzAwOUU3MyIsICIjRjBFNDQyIiwgIiMwMDcyQjIiLCAiI0Q1NUUwMCIsICIjQ0M3OUE3IikNCmBgYA0KDQojIyMgRmluZCBtaW4gbWF4IG9mIHZhcnMgZm9yIHNjYWxlcw0KYGBge3J9DQpzdW1tYXJ5KGVudl9zdWJfbWV0YSkNCmBgYA0KDQoNCg0KIyMjIFBsb3RzIHdpdGggQ09OVElOVU9VUyBjb2xvdXIgc2NhbGVzICh2YXJpYWJsZXMpDQoNCg0KIyMjIyMgQmF0aHkgdiBUZW1wIHcgZ25tZHMgYXggMQ0KYGBge3J9DQp0Yl9heDE8LSBnZ3Bsb3QoZGF0YSA9IGVudl9zdWJfbWV0YSwNCiAgICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IFRtZWFuX1JvYmluc29uLA0KICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gYmF0aHkpKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIGdlb21fcG9pbnQoYWVzKGNvbG91ciA9IGdubWRzMSksDQogICAgICAgICAgICAgc2l6ZSA9IDEpICsNCiAgc2NhbGVfY29sb3VyX2dyYWRpZW50bihsaW1pdHMgPSBjKC0yLCAyLjUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzPWMoJ3JlZCcsJ3llbGxvdycsJ2dyZWVuJykpKw0KICBnZ3RpdGxlKCJUZW1wIChtZWFuIFJvYmluc29uKSB2cyBCYXRoeSAtIGNvbG91cmVkIGJ5IGdubWRzIHI2IGF4MSAtIGdyZXkgMi41LTUiKQ0KDQp0Yl9heDENCg0KYGBgDQojIyMjIyBTYXZlIHRoZSBwbG90DQpgYGB7cn0NCmdnc2F2ZShmaWxlbmFtZSA9IGZpbGUucGF0aChkYXRhUGF0aCwib3V0cHV0cy9Mb0RlbnNiYXRoeV92X3RlbXBfbm1kczEucG5nIiksDQogICAgICAgZGV2aWNlID0gInBuZyIsDQogICAgICAgZHBpPTMwMCApDQpgYGANCiMjIyMjIEJhdGh5IHYgVGVtcCB3IHNhbGluaXR5DQpgYGB7cn0NCnRiX2F4MTwtIGdncGxvdChkYXRhID0gZW52X3N1Yl9tZXRhLA0KICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gVG1lYW5fUm9iaW5zb24sDQogICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBiYXRoeSkpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgZ2VvbV9wb2ludChhZXMoY29sb3VyID0gU21heF9Sb2JpbnNvbiksDQogICAgICAgICAgICAgc2l6ZSA9IDEpICsNCiAgc2NhbGVfY29sb3VyX2dyYWRpZW50bihsaW1pdHMgPSBjKDM0LjQzLCAzNS40MyksDQogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcnM9YygnZ3JlZW4nLCd5ZWxsb3cnLCdibHVlJykpKw0KICBnZ3RpdGxlKCJUZW1wIChtZWFuIFJvYmluc29uKSB2cyBCYXRoeSAtIGNvbG91cmVkIGJ5IHNhbGluaXR5IikNCg0KdGJfYXgxDQoNCmBgYA0KIyMjIyMgU2F2ZSB0aGUgcGxvdA0KYGBge3J9DQpnZ3NhdmUoZmlsZW5hbWUgPSBmaWxlLnBhdGgoZGF0YVBhdGgsIm91dHB1dHMvTG9EZW5zYmF0aHlfdl90ZW1wX3NhbGluaXR5TWF4LnBuZyIpLA0KICAgICAgIGRldmljZSA9ICJwbmciLA0KICAgICAgIGRwaT0zMDAgKQ0KYGBgDQoNCg0KDQojIyMjIyBCYXRoeSB2IFRlbXAgdyBsb25naXR1ZGUNCmBgYHtyfQ0KdGJfYXgxPC0gZ2dwbG90KGRhdGEgPSBlbnZfc3ViX21ldGEsDQogICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSBUbWVhbl9Sb2JpbnNvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGJhdGh5KSkgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICBnZW9tX3BvaW50KGFlcyhjb2xvdXIgPSBYLnkpLA0KICAgICAgICAgICAgIHNpemUgPSAxKSArDQogIHNjYWxlX2NvbG91cl9ncmFkaWVudG4obGltaXRzID0gYygtMTA3OTM5LCAxMTYyMjYxKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9ycz1jKCdyZWQnLCd5ZWxsb3cnLCdibHVlJykpKw0KICBnZ3RpdGxlKCJUZW1wIChtZWFuIFJvYmluc29uKSB2cyBCYXRoeSAtIGNvbG91cmVkIGJ5IGxvbmdpdHVkZSIpDQoNCnRiX2F4MQ0KDQpgYGANCiMjIyMjIFNhdmUgdGhlIHBsb3QNCmBgYHtyfQ0KZ2dzYXZlKGZpbGVuYW1lID0gZmlsZS5wYXRoKGRhdGFQYXRoLCJvdXRwdXRzL0xvRGVuc2JhdGh5X3ZfdGVtcF9sb25naXR1ZGUucG5nIiksDQogICAgICAgZGV2aWNlID0gInBuZyIsDQogICAgICAgZHBpPTMwMCApDQpgYGANCiMjIyMjIEJhdGh5IHYgVGVtcCB3IGxhdGl0dWRlDQpgYGB7cn0NCnRiX2F4MTwtIGdncGxvdChkYXRhID0gZW52X3N1Yl9tZXRhLA0KICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gVG1lYW5fUm9iaW5zb24sDQogICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBiYXRoeSkpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgZ2VvbV9wb2ludChhZXMoY29sb3VyID0gWSksDQogICAgICAgICAgICAgc2l6ZSA9IDEpICsNCiAgc2NhbGVfY29sb3VyX2dyYWRpZW50bihsaW1pdHMgPSBjKDY5NDQxMzQsIDg5NDk3MzQpLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzPWMoJ3JlZCcsJ3llbGxvdycsJ2JsdWUnKSkrDQogIGdndGl0bGUoIlRlbXAgKG1lYW4gUm9iaW5zb24pIHZzIEJhdGh5IC0gY29sb3VyZWQgYnkgbGF0aXR1ZGUiKQ0KDQp0Yl9heDENCg0KYGBgDQojIyMjIyBTYXZlIHRoZSBwbG90DQpgYGB7cn0NCmdnc2F2ZShmaWxlbmFtZSA9IGZpbGUucGF0aChkYXRhUGF0aCwib3V0cHV0cy9Mb0RlbnNiYXRoeV92X3RlbXBfbGF0aXR1ZGUucG5nIiksDQogICAgICAgZGV2aWNlID0gInBuZyIsDQogICAgICAgZHBpPTMwMCApDQpgYGANCiMjIyMjIEJhdGh5IHYgVGVtcCB3IGljZUNvdkxUTWF4DQpgYGB7cn0NCnRiX2F4MTwtIGdncGxvdChkYXRhID0gZW52X3N1Yl9tZXRhLA0KICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gVG1lYW5fUm9iaW5zb24sDQogICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBiYXRoeSkpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgZ2VvbV9wb2ludChhZXMoY29sb3VyID0gQk8yMl9pY2Vjb3Zlcmx0bWF4X3NzKSwNCiAgICAgICAgICAgICBzaXplID0gMSkgKw0KICBzY2FsZV9jb2xvdXJfZ3JhZGllbnRuKGxpbWl0cyA9IGMoMCwwLjkzKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9ycz1jKCdncmV5JywndHVycXVvaXNlJywnYmx1ZScpKSsNCiAgZ2d0aXRsZSgiVGVtcCAobWVhbiBSb2JpbnNvbikgdnMgQmF0aHkgLSBjb2xvdXJlZCBieSBpY2UgY292ZXIgTFQgbWF4IikNCg0KdGJfYXgxDQoNCmBgYA0KIyMjIyMgU2F2ZSB0aGUgcGxvdA0KYGBge3J9DQpnZ3NhdmUoZmlsZW5hbWUgPSBmaWxlLnBhdGgoZGF0YVBhdGgsIm91dHB1dHMvTG9EZW5zYmF0aHlfdl90ZW1wX2ljZUNvdkxUbWF4LnBuZyIpLA0KICAgICAgIGRldmljZSA9ICJwbmciLA0KICAgICAgIGRwaT0zMDAgKQ0KYGBgDQoNCg0KIyMjIyMgQmF0aHkgdiBTYWxpbml0eSBjb2xvdXJlZCBieSB0ZW1wDQpgYGB7cn0NCnRiX2F4MTwtIGdncGxvdChkYXRhID0gZW52X3N1Yl9tZXRhLA0KICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gU21heF9Sb2JpbnNvbiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IGJhdGh5KSkgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICBnZW9tX3BvaW50KGFlcyhjb2xvdXIgPSBUbWVhbl9Sb2JpbnNvbiksDQogICAgICAgICAgICAgc2l6ZSA9IDEpICsNCiAgc2NhbGVfY29sb3VyX2dyYWRpZW50bihsaW1pdHMgPSBjKC0xLjEsIDguNSksDQogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcnM9YygncmVkJywneWVsbG93JywnZ3JlZW4nKSkrDQogIGdndGl0bGUoIlNhbGluaXR5IChtYXggUm9iaW5zb24pIHZzIEJhdGh5IC0gY29sb3VyZWQgYnkgYXYgVGVtcCAoUikiKQ0KDQp0Yl9heDENCg0KYGBgDQojIyMjIyBTYXZlIHRoZSBwbG90DQpgYGB7cn0NCmdnc2F2ZShmaWxlbmFtZSA9IGZpbGUucGF0aChkYXRhUGF0aCwib3V0cHV0cy9Mb0RlbnNiYXRoeV92X3NhbE1heF90ZW1wLnBuZyIpLA0KICAgICAgIGRldmljZSA9ICJwbmciLA0KICAgICAgIGRwaT0zMDAgKQ0KYGBgDQoNCiMjIyMjIFNhbGluaXR5IHYgVGVtcCBnbm1kczENCmBgYHtyfQ0KdGJfYXgxPC0gZ2dwbG90KGRhdGEgPSBlbnZfc3ViX21ldGEsDQogICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSBTbWF4X1JvYmluc29uLA0KICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gVG1lYW5fUm9iaW5zb24pKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIGdlb21fcG9pbnQoYWVzKGNvbG91ciA9IGdubWRzMSksDQogICAgICAgICAgICAgc2l6ZSA9IDEpICsNCnNjYWxlX2NvbG91cl9ncmFkaWVudG4obGltaXRzID0gYygtMiwgMi41KSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9ycz1jKCdyZWQnLCd5ZWxsb3cnLCdncmVlbicpKSsNCiAgZ2d0aXRsZSgiVGVtcCAobWVhbiBSb2JpbnNvbikgdnMgU2FsaW5pdHkgKG1heCBSKSAtIGNvbG91cmVkIGJ5IGdubWRzIHI2IGF4IDEgLSBncmV5IDIuNS01IikNCg0KdGJfYXgxDQoNCmBgYA0KIyMjIyMgU2F2ZSB0aGUgcGxvdA0KYGBge3J9DQpnZ3NhdmUoZmlsZW5hbWUgPSBmaWxlLnBhdGgoZGF0YVBhdGgsIm91dHB1dHMvTG9EZW5zdGVtcFJtZWFuX3Zfc2FsaW5pdHlSbWF4X25tZHMxLnBuZyIpLA0KICAgICAgIGRldmljZSA9ICJwbmciLA0KICAgICAgIGRwaT0zMDAgKQ0KYGBgDQojIyMjIyBTYWxpbml0eSB2IFRlbXAgZGlzc294bWVhbg0KYGBge3J9DQp0Yl9heDE8LSBnZ3Bsb3QoZGF0YSA9IGVudl9zdWJfbWV0YSwNCiAgICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IFNtYXhfUm9iaW5zb24sDQogICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBUbWVhbl9Sb2JpbnNvbikpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgZ2VvbV9wb2ludChhZXMoY29sb3VyID0gQk8yMl9kaXNzb3htZWFuX2JkbWVhbiksDQogICAgICAgICAgICAgc2l6ZSA9IDEpICsNCnNjYWxlX2NvbG91cl9ncmFkaWVudG4obGltaXRzID0gYygyODIuNSwgMzcyLjIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzPWMoJ3JlZCcsJ3llbGxvdycsJ2dyZWVuJykpKw0KICBnZ3RpdGxlKCJUZW1wIChtZWFuIFJvYmluc29uKSB2cyBTYWxpbml0eSAobWF4IFIpIC0gY29sb3VyZWQgYnkgZGlzc29sdmVkIG94eWdlbiIpDQoNCnRiX2F4MQ0KDQpgYGANCiMjIyMjIFNhdmUgdGhlIHBsb3QNCmBgYHtyfQ0KZ2dzYXZlKGZpbGVuYW1lID0gZmlsZS5wYXRoKGRhdGFQYXRoLCJvdXRwdXRzL0xvRGVuc3RlbXBSbWVhbl92X3NhbGluaXR5Um1heF9kaXNvb3htZWFuLnBuZyIpLA0KICAgICAgIGRldmljZSA9ICJwbmciLA0KICAgICAgIGRwaT0zMDAgKQ0KYGBgDQojIyMjIyBUUyAtIGljZWNvdmVyTFRNYXgNCmBgYHtyfQ0KdGJfYXgxPC0gZ2dwbG90KGRhdGEgPSBlbnZfc3ViX21ldGEsDQogICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSBTbWF4X1JvYmluc29uLA0KICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gVG1lYW5fUm9iaW5zb24pKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIGdlb21fcG9pbnQoYWVzKGNvbG91ciA9IEJPMjJfaWNlY292ZXJsdG1heF9zcyksDQogICAgICAgICAgICAgc2l6ZSA9IDEpICsNCiAgc2NhbGVfY29sb3VyX2dyYWRpZW50bihsaW1pdHMgPSBjKDAsMC45MyksDQogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcnM9YygnYmx1ZScsJ2dyZWVuJywncmVkJykpKw0KICBnZ3RpdGxlKCJUZW1wIChBdlIpIHYgU2FsaW5pdHkgKG1heFIpIC0gY29sb3VyZWQgYnkgaWNlIGNvdmVyIExUIG1heCIpDQoNCnRiX2F4MQ0KDQpgYGANCiMjIyMjIFNhdmUgdGhlIHBsb3QNCmBgYHtyfQ0KZ2dzYXZlKGZpbGVuYW1lID0gZmlsZS5wYXRoKGRhdGFQYXRoLCJvdXRwdXRzL0xvRGVuc3RlbXBSbWVhbl92X3NhbGluaXR5Um1heF9pY2VDb3ZlTFRtYXgucG5nIiksDQogICAgICAgZGV2aWNlID0gInBuZyIsDQogICAgICAgZHBpPTgwMCApDQpgYGANCg0KDQojIyMjIyBYIHYgWSAtIHRlbXANCmBgYHtyfQ0KdGJfYXgxPC0gZ2dwbG90KGRhdGEgPSBlbnZfc3ViX21ldGEsDQogICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSBYLA0KICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gWSkpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgZ2VvbV9wb2ludChhZXMoY29sb3VyID0gVG1lYW5fUm9iaW5zb24pLA0KICAgICAgICAgICAgIHNpemUgPSAxKSArDQogIHNjYWxlX2NvbG91cl9ncmFkaWVudG4obGltaXRzID0gYygtMS4xLCA4LjUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzPWMoJ2JsdWUnLCdncmVlbicsJ3JlZCcpKSsNCiAgZ2d0aXRsZSgiR2VvZ3JhcGh5IChYIHYgWSkgLSBjb2xvdXJlZCBieSBtZWFuIHRlbXAiKQ0KDQpnZ3Bsb3RseSh0Yl9heDEpDQoNCmBgYA0KIyMjIyMgU2F2ZSB0aGUgcGxvdA0KYGBge3J9DQpnZ3NhdmUoZmlsZW5hbWUgPSBmaWxlLnBhdGgoZGF0YVBhdGgsIm91dHB1dHMvTG9EZW5zX1hfdl9ZX3RtZWFuUi5wbmciKSwNCiAgICAgICBkZXZpY2UgPSAicG5nIiwNCiAgICAgICBkcGk9MzAwICkNCmBgYA0KDQojIyMjIyBYIHYgWSAtIGRlbnNpdHkNCmBgYHtyfQ0KdGJfYXgxPC0gZ2dwbG90KGRhdGEgPSBlbnZfc3ViX21ldGEsDQogICAgICAgICAgICAgICAgICAgICAgYWVzKHggPSBYLnksDQogICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBZKSkgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICBnZW9tX3BvaW50KGFlcyhjb2xvdXIgPSBzd0RlbnNSb2JfYXZzKSwNCiAgICAgICAgICAgICBzaXplID0gMSkgKw0KICBzY2FsZV9jb2xvdXJfZ3JhZGllbnRuKGxpbWl0cyA9IGMoMTAyNywgMTAzMiksDQogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcnM9YygnYmx1ZScsJ2dyZWVuJywncmVkJykpKw0KICBnZ3RpdGxlKCJHZW9ncmFwaHkgKFggdiBZKSAtIGNvbG91cmVkIGJ5IHdhdGVyIGRlbnNpdHkiKQ0KDQp0Yl9heDENCg0KYGBgDQojIyMjIyBTYXZlIHRoZSBwbG90DQpgYGB7cn0NCmdnc2F2ZShmaWxlbmFtZSA9IGZpbGUucGF0aChkYXRhUGF0aCwib3V0cHV0cy9Mb0RlbnNfWF92X1lfc3dEZW5Sb2JhdnMucG5nIiksDQogICAgICAgZGV2aWNlID0gInBuZyIsDQogICAgICAgZHBpPTgwMCApDQpgYGANCiMjIyMjIFggdiBZIC0gZGlzc294DQpgYGB7cn0NCnRiX2F4MTwtIGdncGxvdChkYXRhID0gZW52X3N1Yl9tZXRhLA0KICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gWC55LA0KICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gWSkpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgZ2VvbV9wb2ludChhZXMoY29sb3VyID0gQk8yMl9kaXNzb3htZWFuX2JkbWVhbiksDQogICAgICAgICAgICAgc2l6ZSA9IDEpICsNCiAgc2NhbGVfY29sb3VyX2dyYWRpZW50bihsaW1pdHMgPSBjKDI4MiwzNzMpLA0KICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzPWMoJ2JsdWUnLCdncmVlbicsJ3JlZCcpKSsNCiAgZ2d0aXRsZSgiR2VvZ3JhcGh5IChYIHYgWSkgLSBjb2xvdXJlZCBieSBkaXNzb3ZsZWQgb3h5Z2VuIikNCg0KdGJfYXgxDQoNCmBgYA0KIyMjIyMgU2F2ZSB0aGUgcGxvdA0KYGBge3J9DQpnZ3NhdmUoZmlsZW5hbWUgPSBmaWxlLnBhdGgoZGF0YVBhdGgsIm91dHB1dHMvTG9EZW5zX1hfdl9ZX2Rpc3NveC5wbmciKSwNCiAgICAgICBkZXZpY2UgPSAicG5nIiwNCiAgICAgICBkcGk9ODAwICkNCmBgYA0KIyMjIyMgWCB2IFkgLSBpY2Vjb3ZlckxUTWF4DQpgYGB7cn0NCnRiX2F4MTwtIGdncGxvdChkYXRhID0gZW52X3N1Yl9tZXRhLA0KICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gWC55LA0KICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gWSkpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgZ2VvbV9wb2ludChhZXMoY29sb3VyID0gQk8yMl9pY2Vjb3Zlcmx0bWF4X3NzKSwNCiAgICAgICAgICAgICBzaXplID0gMSkgKw0KICBzY2FsZV9jb2xvdXJfZ3JhZGllbnRuKGxpbWl0cyA9IGMoMCwwLjkzKSwNCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9ycz1jKCdibHVlJywnZ3JlZW4nLCdyZWQnKSkrDQogIGdndGl0bGUoIkdlb2dyYXBoeSAoWCB2IFkpIC0gY29sb3VyZWQgYnkgaWNlIGNvdmVyIExUIG1heCIpDQoNCnRiX2F4MQ0KDQpgYGANCiMjIyMjIFNhdmUgdGhlIHBsb3QNCmBgYHtyfQ0KZ2dzYXZlKGZpbGVuYW1lID0gZmlsZS5wYXRoKGRhdGFQYXRoLCJvdXRwdXRzL0xvRGVuc19YX3ZfWV9pY2VDb3ZlTFRtYXgucG5nIiksDQogICAgICAgZGV2aWNlID0gInBuZyIsDQogICAgICAgZHBpPTgwMCApDQpgYGANCg0KDQojIyMjIyBUZW1wIHYgZGlzb3hsdG1pbiBnbm1kcw0KYGBge3J9DQp0Yl9heDE8LSBnZ3Bsb3QoZGF0YSA9IGVudl9zdWJfbWV0YSwNCiAgICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IFRtZWFuX1JvYmluc29uLA0KICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gQk8yMl9kaXNzb3htZWFuX2JkbWVhbikpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgZ2VvbV9wb2ludChhZXMoY29sb3VyID0gZ25tZHMxKSwNCiAgICAgICAgICAgICBzaXplID0gMSkgKw0KICBzY2FsZV9jb2xvdXJfZ3JhZGllbnRuKGxpbWl0cyA9IGMoLTIsIDIuNSksDQogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcnM9YygncmVkJywneWVsbG93JywnZ3JlZW4nKSkrDQogIGdndGl0bGUoIlRlbXAgKG1lYW4gUm9iaW5zb24pIHYgZGlzb3ggbWVhbiAtIGNvbG91cmVkIGJ5IGdubWRzIGF4IDEgLSBncmV5IDIuNS01IikNCg0KdGJfYXgxDQoNCmBgYA0KDQojIyMjIyBTYXZlIHRoZSBwbG90DQpgYGB7cn0NCmdnc2F2ZShmaWxlbmFtZSA9IGZpbGUucGF0aChkYXRhUGF0aCwib3V0cHV0cy9Mb0RlbnNfVG1lYW5SX3ZfZGlzc294bHRtaW5fZ25tZHMxLnBuZyIpLA0KICAgICAgIGRldmljZSA9ICJwbmciLA0KICAgICAgIGRwaT0zMDAgKQ0KDQpgYGANCiMjIyMjIFRlbXAgdiBkaXNveGx0bWluIGJhdGh5DQpgYGB7cn0NCnRiX2F4MTwtIGdncGxvdChkYXRhID0gZW52X3N1Yl9tZXRhLA0KICAgICAgICAgICAgICAgICAgICAgIGFlcyh4ID0gVG1lYW5fUm9iaW5zb24sDQogICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBCTzIyX2Rpc3NveG1lYW5fYmRtZWFuKSkgKw0KICB0aGVtZV9jbGFzc2ljKCkgKw0KICBnZW9tX3BvaW50KGFlcyhjb2xvdXIgPSBiYXRoeSksDQogICAgICAgICAgICAgc2l6ZSA9IDEpICsNCiAgc2NhbGVfY29sb3VyX2dyYWRpZW50bihsaW1pdHMgPSBjKC04NjAsIC0zMCksDQogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcnM9YygncmVkJywneWVsbG93JywnZ3JlZW4nKSkrDQogIGdndGl0bGUoIlRlbXAgKG1lYW4gUm9iaW5zb24pIHYgZGlzb3ggbWVhbiAtIGNvbG91cmVkIGJ5IGJhdGh5bWV0cnkiKQ0KDQp0Yl9heDENCg0KYGBgDQoNCiMjIyMjIFNhdmUgdGhlIHBsb3QNCmBgYHtyfQ0KZ2dzYXZlKGZpbGVuYW1lID0gZmlsZS5wYXRoKGRhdGFQYXRoLCJvdXRwdXRzL0xvRGVuc1RtZWFuUl92X2Rpc3NveGx0bWluX2JhdGh5LnBuZyIpLA0KICAgICAgIGRldmljZSA9ICJwbmciLA0KICAgICAgIGRwaT0zMDAgKQ0KDQpgYGANCg0KDQoNCiMjIyBQbG90cyB3aXRoIERJU0NSRVRFIGNvbG91ciBzY2FsZXMgKHZhcmlhYmxlcykNCg0KIyMjIyBYIHYgWSB3aXRoIG1sZC1iYXRoeSBjYXRlZ29yaWVzDQpgYGB7cn0NCmRpc19zcGxpdCA8LSBnZ3Bsb3QoZGF0YSA9IGVudiwNCiAgICAgICAgICAgICAgYWVzKHggPSBYLnksDQogICAgICAgICAgICAgICAgICB5ID0gWSkpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgZ2VvbV9wb2ludChhZXMoY29sb3VyID0gTUxEbWVhbl9iYXRoeSksDQogICAgICAgICAgICAgc2l6ZSA9IDEpICsNCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9Y2JQYWxldHRlKSsNCiAjIHNjYWxlX2NvbG91cl9icmV3ZXIocGFsZXR0ZSA9ICJTZXQzIikgKw0KICBnZ3RpdGxlKCJFYXN0aW5nIHZzIE5vcnRoaW5nIC0gY29sb3VyZWQgYnkgTWl4ZWQgbGF5ZXIgZGVwdGggcHJveGltaXR5IikNCg0KZGlzX3NwbGl0DQoNCmBgYA0KDQojIyMjIyBTYXZlIHRoZSBwbG90DQpgYGB7cn0NCmdnc2F2ZShmaWxlbmFtZSA9IGZpbGUucGF0aChkYXRhUGF0aCwib3V0cHV0cy9Mb0RlbnNfWHZZX01MRG1lYW5CYXRoeS5wbmciKSwNCiAgICAgICBkZXZpY2UgPSAicG5nIiwNCiAgICAgICBkcGk9MzAwICkNCg0KYGBgDQoNCiMjIyBjYXRlZ29yaXNlIGdubWRzDQoNCmBgYHtyfQ0KZW52X3N1Yl9tZXRhJGF4MWNhdDwtY3V0KGVudl9zdWJfbWV0YSRnbm1kczEsIA0KICAgICAgYnJlYWtzPWMoLTMuMiwtMywtMiwtMSwwLDEsMiwzLDMuNDYpKQ0KDQplbnZfc3ViX21ldGEkYXgyY2F0PC1jdXQoZW52X3N1Yl9tZXRhJGdubWRzMiwgDQogICAgICBicmVha3M9YygtMS45LC0xLDAsMSwyLDMsNCw0LjkpKQ0KYGBgDQoNCg0KIyMjIyBYIHYgWSB3aXRoIGdubWRzIGF4IDEgYXMgSEMgY2F0ZWdvcmllcw0KYGBge3J9DQpkaXNfc3BsaXQgPC0gZ2dwbG90KGRhdGEgPSBlbnZfc3ViX21ldGEsDQogICAgICAgICAgICAgIGFlcyh4ID0gWC55LA0KICAgICAgICAgICAgICAgICAgeSA9IFkpKSArDQogIHRoZW1lX2NsYXNzaWMoKSArDQogIGdlb21fcG9pbnQoYWVzKGNvbG91ciA9IGF4MWNhdCksDQogICAgICAgICAgICAgc2l6ZSA9IDEpICsNCiAjIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWNiUGFsZXR0ZSkgKyMgbm9uLW9yZGVyZWQgY29sb3VyYmxpbmQgcGFsbGV0dGUNCiAgc2NhbGVfY29sb3VyX2JyZXdlcihwYWxldHRlID0gIlNwZWN0cmFsIikgKyAjIG9yZGVyZWQgY29sb3VyYmxpbmQgcGFsbGV0dGUNCiAgZ2d0aXRsZSgiRWFzdGluZyB2cyBOb3J0aGluZyAtIGNvbG91cmVkIGJ5IGdubWRzIGF4aXMgMSBIQyB1bml0cyIpDQoNCmRpc19zcGxpdA0KDQpgYGANCg0KIyMjIyMgU2F2ZSB0aGUgcGxvdA0KYGBge3J9DQpnZ3NhdmUoZmlsZW5hbWUgPSBmaWxlLnBhdGgoZGF0YVBhdGgsIm91dHB1dHMvTG9EZW5zX1h2WV9heDFjYXQucG5nIiksDQogICAgICAgZGV2aWNlID0gInBuZyIsDQogICAgICAgZHBpPTMwMCApDQoNCmBgYA0KDQojIyMjIFggdiBZIHdpdGggZ25tZHMgYXggMiBhcyBIQyBjYXRlZ29yaWVzDQpgYGB7cn0NCmRpc19zcGxpdCA8LSBnZ3Bsb3QoZGF0YSA9IGVudl9zdWJfbWV0YSwNCiAgICAgICAgICAgICAgYWVzKHggPSBYLnksDQogICAgICAgICAgICAgICAgICB5ID0gWSkpICsNCiAgdGhlbWVfY2xhc3NpYygpICsNCiAgZ2VvbV9wb2ludChhZXMoY29sb3VyID0gYXgyY2F0KSwNCiAgICAgICAgICAgICBzaXplID0gMSkgKw0KICMgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9Y2JQYWxldHRlKSArIyBub24tb3JkZXJlZCBjb2xvdXJibGluZCBwYWxsZXR0ZQ0KICBzY2FsZV9jb2xvdXJfYnJld2VyKHBhbGV0dGUgPSAiU3BlY3RyYWwiKSArICMgb3JkZXJlZCBjb2xvdXJibGluZCBwYWxsZXR0ZQ0KICBnZ3RpdGxlKCJFYXN0aW5nIHZzIE5vcnRoaW5nIC0gY29sb3VyZWQgYnkgZ25tZHMgYXhpcyAyIEhDIHVuaXRzIikNCg0KZGlzX3NwbGl0DQoNCmBgYA0KDQoNCg0KDQojIyMjIyBTYXZlIHRoZSBwbG90DQpgYGB7cn0NCmdnc2F2ZShmaWxlbmFtZSA9IGZpbGUucGF0aChkYXRhUGF0aCwib3V0cHV0cy9Mb0RlbnNfWHZZX2F4MmNhdC5wbmciKSwNCiAgICAgICBkZXZpY2UgPSAicG5nIiwNCiAgICAgICBkcGk9MzAwICkNCg0KYGBgDQoNCiMgU2F2ZSBlbnZpcm9ubWVudA0KDQpFRElUIEFSRUEgRklSU1QhDQoNCmBgYHtyfQ0Kc2F2ZS5pbWFnZSgiSTovU2NyaXB0cy9kZWVwc2VhTmlOL1JlbnZfZGVlcHNlYU5pTl9Mb0RlbnMuUkRhdGEiKSAjIGVkaXQgYXJlYSBmaXJzdA0KDQpgYGANCg0KTk9XIENMRUFSIEVOVklST05NRU5UIEJFRk9SRSBSVU5OSU5HIEZPUiBORVcgQVJFQQ0KDQo=